added samples
[windows-sources.git] / sdk / samples / all in on code / Visual Studio 2008 / CppHookDll / HookDll.cpp
blobfa7d94f05139c03be8def9c1a70f94fa9eebb1a2
1 /****************************** Module Header ******************************\
2 * Module Name: HookDll.cpp
3 * Project: CppHookDll
4 * Copyright (c) Microsoft Corporation.
5 *
6 * Defines the exported hook procedure.
7 *
8 * This source is subject to the Microsoft Public License.
9 * See http://www.microsoft.com/opensource/licenses.mspx#Ms-PL.
10 * All other rights reserved.
12 * History:
13 * * 5/01/2009 11:04 PM RongChun Zhang Created
14 \***************************************************************************/
17 #include <windows.h>
19 #define HOOKDLL_EXPORTS
20 #include "HookDll.h"
23 // Shared data among all instances.
24 #pragma data_seg(".HOOKDATA")
25 HWND g_hWnd = NULL; // Window handle
26 HHOOK g_hHook = NULL; // Hook handle
28 // Get module from address
29 HMODULE WINAPI ModuleFromAddress(PVOID pv)
31 MEMORY_BASIC_INFORMATION mbi;
32 if (::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
34 return (HMODULE)mbi.AllocationBase;
36 else
38 return NULL;
42 // Hook callback
43 LRESULT CALLBACK KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
45 if (nCode < 0 || nCode == HC_NOREMOVE)
46 return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
48 if (lParam & 0x40000000) // Check the previous key state
50 return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
53 // Post private messages to Main window
54 // wParam specifies the virtual key code
55 // lParam specifies the key data
56 ::PostMessage(g_hWnd, WM_KEYSTROKE, wParam, lParam);
58 return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
61 // Install or uninstall the hook
62 BOOL WINAPI SetKeyboardHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller)
64 BOOL bOk;
65 g_hWnd = hWndCaller;
67 if (bInstall)
69 g_hHook = ::SetWindowsHookEx(WH_KEYBOARD, KeyboardHookProc,
70 ModuleFromAddress(KeyboardHookProc), dwThreadId);
71 bOk = (g_hHook != NULL);
73 else
75 bOk = ::UnhookWindowsHookEx(g_hHook);
76 g_hHook = NULL;
79 return bOk;
83 // Hook callback
84 LRESULT CALLBACK LowKeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
86 if (nCode < 0 || nCode == HC_NOREMOVE)
87 return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
89 if (lParam & 0x40000000) // Check the previous key state
91 return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
94 KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *)lParam;
96 //check that the message is from keyboard or is synthesized by SendInput API
97 if((pkbhs->flags & LLKHF_INJECTED))
98 return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
100 if(wParam == WM_KEYDOWN)
102 // Post private messages to Main window
103 // wParam specifies the virtual key code
104 // lParam specifies the scan code
105 ::PostMessage(g_hWnd, WM_KEYINPUT, pkbhs->vkCode, pkbhs->scanCode);
108 return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
111 BOOL WINAPI SetLowKeyboardHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller)
113 BOOL bOk;
114 g_hWnd = hWndCaller;
116 if (bInstall)
118 g_hHook = ::SetWindowsHookEx(WH_KEYBOARD_LL, LowKeyboardHookProc,
119 ModuleFromAddress(LowKeyboardHookProc), dwThreadId);
120 bOk = (g_hHook != NULL);
122 else
124 bOk = ::UnhookWindowsHookEx(g_hHook);
125 g_hHook = NULL;
128 return bOk;